import asyncio
import requests
import time

#传统的异步架构，在网络io无法实现异步
start = time.time()

#请求网页 得到网页的输出
# async def task():
#     url = 'http://www.sina.com.cn'
#     print(f"{time.strftime('%H:%M:%S')} task 开始请求 ")
#     time.sleep(2)
#     response = requests.get(url)#request对象保存全部请求数据  response保存全部返回数据
#     print(f'得到响应 {response.text}')
#
# tasks = [task() for i in range(5)] #for 循环5次，每循环一次调用一个task（），得到返回，得到5个返回值
# loop = asyncio.get_event_loop()#得到时间运行的循环
# print(f"{time.strftime('%H:%M:%S')} 开始调用协程任务 ")
# start  = time.time()
# loop.run_until_complete(asyncio.wait(tasks)) #当协程调用结束，让循环体通知执行
# end  = time.time()
# print(f"{time.strftime('%H:%M:%S')} 协程任务结束，耗时{end - start }秒")

from fake_useragent import UserAgent
import requests
import aiohttp


now = lambda : time.strftime('%H:%M:%S')
url = 'https://www.biquge11.cc'
#异步 得到网页内容
async  def get(url):
    #面食造型同步
    session = aiohttp.ClientSession() #session 会话  request请求 连续通讯都在一次请求中， 只要没有完全中断，
    # 没有数据交换 重新联系还是在一次会话中，一次request中说明的变量只在本次request中有效，而一次session中声明的变量在本次session中的
    # 全部request都有效
    #烤制异步
    response = await session.get(url=url)  # 使用requests对象提交请求可以更简便切换一些参数 get post
    result = await  response.text()#html在response文本中 text
    # 发请求是当cpu完成发请求之后就可以挂起当前任务执行其他任务，但是网卡你继续干活
    return result


async def request():#烤面包，如果不把这个烤面包方法做成异步，烤5份 就一次烤一份排队烤完
    print(f"{time.strftime('%H:%M:%S')} task 开始请求 ")
    html = await get(url)#request对象保存全部请求数据  response保存全部返回数据 #得到一份完成的烤面包 可以是异步的
    print(html)
start  = time.time()
tasks = [asyncio.ensure_future(request()) for i in range(5)] #for 循环5次，每循环一次调用一个task（），得到返回，得到5个返回值
loop = asyncio.get_event_loop()#得到时间运行的循环
print(f"{time.strftime('%H:%M:%S')} 开始调用协程任务 ")
loop.run_until_complete(asyncio.wait(tasks))
end  = time.time()
print(f"{time.strftime('%H:%M:%S')} 协程任务结束，耗时{end - start }秒")


